(begin
  (use tcp      ;; TCP/IP
       srfi-18) ;; Threads
  (load "/home/eduardo/Dropbox/UFABC/15 Quadrimestre/Paradigmas de programação/Projeto/mud-paradigma-funcional/trunk/include/game-traduzido.scm")
  
  (define porta 9010)) ;; constante, número da porta TCP
  

;; Servidor:
;; Aceita conexão TCP e chama interage.
(define trata
  (lambda (s pid)
    ;; tcp-accept aceita uma conexão e retorna duas portas,
    ;; uma de entrada e uma de saída
    (let-values (((in out) (tcp-accept s)))
      ;; tcp-addresses devolve dois IPs -- o do servidor e
      ;; o do cliente que se conectou.
      (let-values (((meu-ip ip-dele) (tcp-addresses in)))
        ;; Comece a thread que interage:
        (thread-start! (make-thread
                       (lambda ()
                         (startgame 1 in out pid)
                         (print "foi")
                         ;; após interagir, fechamos a porta:
                         (close-output-port out))))))

    ;; Depois de criar uma thread para cuidar da conexão, reinicie
    ;; (chama trata novamente):
    (trata s pid)))


;; Pega uma porta, começa a ouvir, e chama o tratador
;; de socket.
(define inicia-servidor
  (lambda ()
    (let inicia ((socket (tcp-listen porta))
                 (count 0))
      (define start (make-thread (trata socket count)))
      (set! count (+ count 1))
      (thread-start! start)
      (inicia socket count))))

(inicia-servidor)


;; Cliente:
;; O cliente pode fazer o seguinte para conecter-se a um servidor:
;(let-values ( ((in out) (tcp-connect "servidor" PORTA)))
  ;; Aqui in é input-port e
  ;; out é output-port
 ; )
